table of contents
MADVISE(2) | Manuel du programmeur Linux | MADVISE(2) |
NOM¶
madvise - Configure l'utilisation de la mémoire
SYNOPSIS¶
#include <sys/mman.h>
int madvise(void *addr, size_t length, int advice);
Exigences de macros de test de fonctionnalités pour la glibc (voir
feature_test_macros(7)) :
madvise() : _BSD_SOURCE
DESCRIPTION¶
L'appel système madvise() conseille le noyau sur la façon de gérer la pagination sur l'intervalle d'adresses débutant à l'adresse addr et de taille length (en octets). Il permet à une application d'indiquer au noyau l'utilisation qu'elle compte faire de certaines zones de mémoire partagée ou projetée de façon à ce que le noyau puisse choisir les techniques de lecture anticipée et de mise en cache appropriées. Cet appel ne modifie pas la sémantique de l'application (sauf dans le cas de MADV_DONTNEED), mais peut avoir un impact sur ses performances. Le noyau est libre d'ignorer le conseil.
Le conseil est spécifié par le paramètre advice qui peut prendre les valeurs
- MADV_NORMAL
- Pas de traitement particulier. Il s'agit du comportement par défaut.
- MADV_RANDOM
- Prévoit des accès aux pages dans un ordre aléatoire. (Ainsi, la lecture anticipée sera moins utile qu'elle ne l'est en général.)
- MADV_SEQUENTIAL
- prévoit des accès aux pages dans un ordre séquentiel. (Aussi, les pages d'un intervalle donné peuvent être systématiquement lues par anticipation, et peuvent être libérées rapidement après avoir été accédées.)
- MADV_WILLNEED
- Prévoit un accès dans un futur proche. (Ainsi, lire quelques pages de façon anticipée peut être une bonne idée.)
- MADV_DONTNEED
- Ne prévoit pas d'accès dans un futur proche. (Pour l'instant, l'application en a fini avec l'intervalle considéré, ainsi le noyau peut‐il libérer les ressources associées à ce dernier.) Les accès ultérieurs aux pages de l'intervalle réussiront, mais résulteront soit en un rechargement du fichier projeté sous‐jacent (voir mmap(2)), soit en un remplissage avec des zéros pour les pages sans fichier.
- MADV_REMOVE (depuis Linux 2.6.16)
- Libérer un ensemble contigu de pages et les ressources correspondantes. Actuellement, ceci n'est possible que sur shmfs/tmpfs ; les autres systèmes de fichiers renvoient l'erreur ENOSYS.
- MADV_DONTFORK (depuis Linux 2.6.16)
- Ne pas rendre les pages de cet intervalle disponibles au fils après un fork(2). Ceci est utile pour empêcher la sémantique de copie à l'écriture de changer l'emplacement physique d'une page si le père y écrit après un fork(2). (De tels déplacements posent des problèmes si le matériel accède directement à la page (DMA)).
- MADV_DOFORK (depuis Linux 2.6.16)
- Annuler l'effet de MADV_DONTFORK et restaurer le comportement par défaut, où une projection en mémoire est héritée après un fork(2).
VALEUR RENVOYÉE¶
En cas de succès madvise() renvoie zéro. En cas d'erreur, il renvoie -1 et errno est positionné de façon adéquate.
ERREURS¶
- EAGAIN
- Une ressource du noyau est temporairement indisponible.
- EBADF
- La projection existe, mais la zone n'est pas associée à un fichier.
- EINVAL
- la valeur len est négative, addr n'est pas aligné sur une page, advice n'a pas une valeur valide, ou bien l'application tente de libérer des pages verrouillées ou partagées (avec MADV_DONTNEED).
- EIO
- (pour MADV_WILLNEED) Suivre la consigne de pagination sur cette zone dépasserait la limite maximale de mémoire physique utilisable par le processus.
- ENOMEM
- (pour MADV_WILLNEED) Mémoire insuffisante ; échec de pagination.
- ENOMEM
- Les adresses de l'intervalle spécifié ne sont pas projetées actuellement, ou n'appartiennent pas à l'espace d'adressage du processus.
CONFORMITɶ
POSIX.1b. POSIX.1-2001 spécifie l'appel posix_madvise(3) avec des constantes POSIX_MADV_NORMAL, etc. et un comportement proche de celui décrit ici. Il existe un appel similaire posix_fadvise(2) pour les accès aux fichiers.
MADV_REMOVE, MADV_DONTFORK et MADV_DOFORK sont spécifiques à Linux.
NOTES¶
Notes sur Linux¶
L'implémentation Linux actuelle (2.4.0) perçoit davantage cet appel système comme une commande que comme un conseil et est ainsi susceptible de renvoyer une erreur quand elle ne parvient pas à réaliser ce qu'elle devrait accomplir en réponse à ce conseil. (Voir la description des ERREURS ci‐dessus.) Il s'agit d'un comportement non standard.
L'implémentation Linux nécessite que l'adresse addr soit alignée sur une page, et permet que length vaille zéro. S'il y a des parties de l'intervalle d'adresses spécifié qui ne sont pas projetées, la version Linux de madvise() les ignore et applique l'appel au reste de l'intervalle (mais renvoie ENOMEM comme il se doit).
VOIR AUSSI¶
getrlimit(2), mincore(2), mmap(2), mprotect(2), msync(2), munmap(2)
COLOPHON¶
Cette page fait partie de la publication 3.23 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies peuvent être trouvées à l'adresse <URL:http://www.kernel.org/doc/man-pages/>.
TRADUCTION¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <URL:http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du projet perkamon <URL:http://alioth.debian.org/projects/perkamon/>.
Stéphan Rafin (2002), Alain Portal <URL:http://manpagesfr.free.fr/> (2006). Julien Cristau et l'équipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en écrivant à <perkamon-l10n-fr@lists.alioth.debian.org>.
Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « LC_ALL=C man <section> <page_de_man> ».
22 avril 2008 | Linux |